package com.kxn.multi.module.service.service;

import com.kxn.multi.module.service.dto.api.user.UserLoginDto;
import com.kxn.multi.module.service.dto.api.user.UserLoginReq;
import com.kxn.multi.module.service.dto.api.user.UserRegisterDto;
import com.kxn.multi.module.service.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.kxn.multi.module.service.dto.api.user.UserRegisterReq;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.List;

/**
* <p>
* 用户表 服务类
* </p>
*
* @author kxn
* @since 2023-04-06
*/
public interface UserService extends IService<User> {

    /**
    * 用户表分页列表
    * @param param 根据需要进行传值
    * @return
    */
    IPage<User> page(User param);

    /**
    * 用户表详情
    * @param id
    * @return
    */
    User detail(Long id);

    /**
    * 用户表新增
    * @param param 根据需要进行传值
    * @return
    */
    void create(User param);

    /**
    * 用户表修改
    * @param param 根据需要进行传值
    * @return
    */
    void update(User param);

    /**
    * 用户表修改
    * @param id 主键id
    * @param param 根据需要进行传值
    * @return
    */
    void updateById(Long id, User param);

    /**
    * 用户表删除(单个条目)
    * @param id
    * @return
    */
    void delete(Long id);

    /**
    * 删除(多个条目)
    * @param ids
    * @return
    */
    void batchDelete(List<Long> ids);

    /**
     * 密码是否相等
     *
     * @param rawPassword 未加密密码
     * @param encodedPassword 已加密密码
     * @return
     */
    public boolean isPasswordMatch(String rawPassword, String encodedPassword);

    /**
     * 对密码进行加密
     *
     * @param password 密码
     * @return 加密后的密码
     */
    String encodePassword(String password);

    /**
     * 根据用户名查找用户
     *
     * @param username
     * @return
     */
    User getUserByUsername(String username);

    /**
     * 根据手机号查找用户
     *
     * @param username
     * @return
     */
    User getUserByPhone(String username);

    /**
     * 生成token
     *
     * @param user
     * @return
     */
    String generateToken(User user);

    UserRegisterDto register(UserRegisterReq userRegisterReq);

    UserLoginDto login(UserLoginReq userLoginReq);

    UserDetails loadUserByUsername(String username);
}
